package com.thinkgsp.jxc.persistence;

import java.math.BigDecimal;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.thinkgsp.jxc.model.Inventory;

/**
 * 存货持久化类
 * @author evan
 *
 */
public interface InventoryMapper {

	/**
	 * 根据库存ID获取产品库存
	 * @param InvId
	 * @return
	 */
	public Inventory getInventory(Long InvId);
	
	/**
	 * 根据存货地址获取产品库存
	 * @param fyear  年份
	 * @param period 期间
	 * @param invAddId 存货地址ID 
	 * @return
	 */
	public List<Inventory> getInventoryByInvAdd(@Param(value="fyear") Integer fyear,@Param(value="period") Integer period,@Param(value="invAddId") Integer invAddId);
	
	/**
	 * 获取登录部门的产品库存
	 * @param fyear
	 * @param period
	 * @return
	 */
	public List<Inventory> getInventoryByDept(@Param(value="fyear") Integer fyear,@Param("period") Integer period);
	
	/**
	 * 根据产品类别获取产品库存
	 * @param fyear
	 * @param period
	 * @param invAddId 本参数已经不用，换成deptId
	 * @param classifyId
	 * @return
	 */
	public List<Inventory> getInventoryByClassifyId(@Param(value="fyear") Integer fyear,@Param(value="period") Integer period,@Param(value="classifyId") Integer classifyId);
	
	/**
	 * 根据存货地址、产品Id与批号Id精准匹配产品库存；
	 * 本方法使用for update 锁定表
	 * @param fyear 年份
	 * @param period 期间
	 * @param productId 产品Id
	 * @param invAddId 存货地址Id
	 * @param batchNoId 批号Id
	 * @return
	 */
	public Inventory findInventory(@Param(value="fyear") Integer fyear,@Param(value="period") Integer period,@Param(value="productId") Integer productId,@Param(value="invAddId") Integer invAddId,@Param(value="batchNoId") Long batchNoId);
	
	/**
	 * 搜索存货地址库存
	 * @param fyear 年份
	 * @param period 期间
	 * @param invAddId 存货地址Id
	 * @param val 产品搜索值 
	 * @see com.thinkgsp.jxc.Product#searchProduct(String)
	 * @return
	 */
	public List<Inventory> searchInventoryByInvAddId(@Param(value="fyear") Integer fyear,@Param(value="period") Integer period,@Param(value="invAddId") Integer invAddId,@Param(value="val") String val);
	
	/**
	 * 搜索所在部门的所属库房库存
	 * @param fyear
	 * @param period
	 * @param val
	 * @return
	 */
	public List<Inventory> searchInventoryByDeptId(@Param(value="fyear") Integer fyear,@Param(value="period") Integer period,@Param(value="val") String val);
	/**
	 * 搜索产品的所有存货地址库存
	 * @param fyear 年份
	 * @param period 期间
	 * @param val  产品搜索值
	 * @see com.thinkgsp.jxc.Product#searchProduct(String)
	 * @return
	 */
	public List<Inventory> searchInventory(@Param(value="fyear") Integer fyear,@Param(value="period") Integer period,@Param(value="val") String val);
	
	/**
	 * 新增产品库存
	 * @param inv
	 */
	public void insertInventory(Inventory inv);
	
	/**
	 * 删除产品库存
	 * @param invId
	 */
	public Integer deleteInventory(Long invId);
	
	/**
	 * 更新产品成本价
	 * @param invId
	 */
	public void updateCostPrice(Long invId);
	
	/**
	 * 产品入库
	 * @param invId 库存Id
	 * @param inQty 入库数量
	 * @param inAmt 入库金额
	 */
	public int income(@Param(value="invId") Long invId,@Param(value="inQty") BigDecimal inQty,@Param(value="inAmt") BigDecimal inAmt);
	
	/**
	 * 产品出库
	 * @param invId 库存Id
	 * @param outQty 出库数量
	 * @param outAmt 出库金额
	 */
	public int outcome(@Param(value="invId") Long invId,@Param(value="outQty") BigDecimal outQty);
	
	/**
	 * 产品待入库
	 * @param invId 库存id
	 * @param waitInQty 待入库数量
	 */
	public int waitIncome(@Param(value="invId") Long invId,@Param(value="waitInQty") BigDecimal waitInQty);
	
	/**
	 * 产品待出库
	 * @param invid 库存Id
	 * @param waitOutQty 待出库数量
	 */
	public int waitOutcome(@Param(value="invId") Long invId,@Param(value="waitOutQty") BigDecimal waitOutQty);
	
	/**
	 * 更新存货状态
	 * @param invid 库存Id
	 * @param state 库存状态 : 0 正常; 1 停止发货
	 */
	public void updateState(@Param(value="invId") Long invId,@Param(value="state") Integer state);
	
	/**
	 * 期末结转
	 * @param curYear 当前年份
	 * @param curPeriod 当前期间
	 * @param nextYear 下一期年份
	 * @param nextPeriod 下一期期间
	 */
	public void periodEndForward(@Param(value="curYear") Integer curYear,@Param(value="curPeriod") Integer curPeriod,@Param(value="nextYear") Integer nextYear,@Param(value="nextPeriod") Integer nextPeriod);
	
	/**
	 * 清空存货表
	 */
	public void clearInventory();
	/**
	 * 清空单据表
	 */
	public void clearBill();
	/**
	 * 清空单据明细表
	 */
	public void clearBillDetail();
	/**
	 * 清空单据扩展表
	 */
	public void clearBillExtend();
}
